const Router = require('koa-router');
const common = require('./common');
const path = require('path');


module.exports = function(fields, table, page_type){
    /* 参数说明： 
        fields(obj)：字段
        table(str)：表名
        page_type(str)：区块名
    */
    let router = new Router;

    // 定义区块
    const page_types = {
        'banner':'banner管理',
        'catalog':'类目管理',
        'article':'文章管理',
    }

    // 页面请求
    router.get('/', async ctx => {
        let {HTTP_ROOT} = ctx.config;
        // 查询并返回数据
        let datas = await ctx.db.query(`SELECT * FROM ${table}`);

        // 针对select类型提供options
        fields.forEach(async field => {
            if(field.type === 'select') {
                field.items = await ctx.db.query(field.from)
            } 
        })

        await ctx.render('admin/table', {
            datas,HTTP_ROOT,
            // 定义字段
            fields,
            page_type,
            page_types
        })
    })

    // 页面提交
    router.post('/', async ctx => {
        let {HTTP_ROOT} = ctx.config;

        var vals = [],
            keys = [];
        // 循环去拿键和请求携带的数据
        fields.forEach(field => {
            let {name, type} = field;
            keys.push(name)
            if(type === 'file'){
                vals.push(path.basename(ctx.request.fields[name][0].path))
            } else if(type === 'date'){  // 如果是date(yy--mm--dd) 就格式化文本成数据库所接受的形式
                vals.push(Math.floor(new Date(ctx.request.fields[name]).getTime() / 1000))
            } else {
                vals.push(ctx.request.fields[name])
            }
        })


        // 将填入信息插入到数据库
        await ctx.db.query(`INSERT INTO ${table}(${keys.join()}) VALUES(${keys.map(key => '?').join()})`,vals)

        // 反馈信息
        ctx.redirect(`${HTTP_ROOT}/admin/${page_type}`)
    })

        // 页面接口 
        // 获取所需数据
        router.get('/get/:id', async ctx => {
            let {id} = ctx.params;

            let rows = await ctx.db.query(`SELECT * FROM ${table} WHERE ID=?`,id);

            if(rows.length) {
                ctx.body = {
                    err:0,
                    msg:'success',
                    data:rows[0]
                }
            } else {
                ctx.body = {
                    err:1,
                    msg:'no this data'
                }
            }

        })

        // 删除
        router.get('/delete/:id/', async ctx => {
            // 拿到删除的id
            let {id} = ctx.params;
            let {UPLOAD_DIR} = ctx.config;
            let {HTTP_ROOT} = ctx.config;

            // 从库里查询是否存在这条信息
            let data = await ctx.db.query(`SELECT * FROM ${table} WHERE ID=?`, [id]);

            // 断言判断
            ctx.assert(data.length, 400 ,'no data')
            let row = data[0];
            // 判断如果是携带文件则删除服务器上对应的文件
            fields.forEach(async ({name, type}) => {
                if(type === 'file') {
                    await common.unlink(path.resolve(UPLOAD_DIR, row[name]))
                } 
            })
            await ctx.db.query(`DELETE FROM ${table} WHERE ID=?`, [id])
            ctx.redirect(`${HTTP_ROOT}/admin/${page_type}`)
        })

        // 修改
        router.post('/modify/:id/', async ctx => {
            let post = ctx.request.fields;
            let {id} = ctx.params;
            let {HTTP_ROOT, UPLOAD_DIR} = ctx.config;

            // 获取原来的文件名
            let rows = await ctx.db.query(`SELECT * FROM ${table} WHERE ID=?`, id);
            ctx.assert(rows.length, 400, 'not find this filename')

            // 保留文件路径
            let paths = {};
            // 定义原有字段
            let keys = [];
            let vals = [];
            // 判断文件是否发生改变
            let src_changed = {};

            fields.forEach(({name, type}) => {
                // 如果携带文件
                if (type === 'file') {
                    // 添加原来的文件路径
                    paths[name] = rows[0][name]
                    // 判断文件是否发生改变
                    if(post[name] && post[name].length && post[name][0].size) {
                        src_changed[name] = true
                        // 添加文件名
                        keys.push(name)
                        vals.push(path.basename(post[name][0].path))
                    }
                }else if(type === 'date'){  // 如果是date(yy--mm--dd) 就格式化文本成数据库所接受的形式
                    keys.push(name)
                    vals.push(Math.floor(new Date(post[name]).getTime() / 1000))
                } else {
                    keys.push(name)
                    vals.push(post[name])
                }
            })

            // console.log(keys,vals)

            // 对库的操作
            await ctx.db.query(`UPDATE ${table} SET ${
                keys.map(key => `${key}=?`).join(',')
            } WHERE ID=?`,[...vals,id])

            fields.forEach(async ({name, type}) => {
                // 删除数据的同时也删除对应关联的图片文件
                if(type === 'file' && src_changed[name] ){
                    await common.unlink(path.resolve(UPLOAD_DIR, paths[name]))
                }
            })
            ctx.redirect(`${HTTP_ROOT}/admin/${page_type}`);
        })

    return router.routes();
};